home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
meminit2.arc
/
MEMINIT.ASM
Wrap
Assembly Source File
|
1987-08-06
|
4KB
|
129 lines
PAGE 57,132
;
; This program was initially developed to minimize the boot up time on a PC.
; It is adaptible to increasing the memory size DOS sees to greater (or less)
; than 640K
;
;
; SET THE INTERNAL PC SWITCHES TO 64K MEMORY. THIS PROGRAM WILL
; UPDATE DOS 2.X AND 3.X MEMORY CONTROL BLOCKS TO REFLECT ACTUAL
; MEMORY SIZE.
;
; THIS SHOULD BE THE FIRST PROGRAM IN YOUR AUTOEXEC.BAT FILE, AND IS
; DESIGNED TO BE A LO-LOADING .EXE PROGRAM
;
; ROM POST WILL ONLY CHECK THE FIRST 64 K OF MEM, REDUCING POWER ON TIME
; TO ABOUT 20 SECONDS.
;
;
;
STACK SEGMENT PARA STACK 'STACK'
DW 128 DUP (?)
STACK ENDS
MEMINIT SEGMENT PARA 'CODE'
ASSUME CS:MEMINIT,DS:MEMINIT,SS:STACK
LOCORE EQU 40H ;BASE OF DOS VARIABLES
SYSSIZE EQU WORD PTR ES:[19] ;WHERE DOS KEEPS MEM INFO
IOCSIZE EQU WORD PTR ES:[21] ;IO CHANNEL MEMORY SIZE
ORIGSYS DW 0 ;SAVE AREA - ORIGINAL CPU MEMORY
ORIGIOC DW 0 ;SAVE AREA - ORIGINAL IO CHANNEL MEMORY
MYOWNPSP DW 0 ;SEGMENT ADDRESS FOR THIS PGMS PSP
SIZMSG DB 'MEM SIZE RESET',10,13,'$'
;*******************************************************************************
;
; INITIALIZE MEMORY SIZE
;
;*******************************************************************************
MEM0000 PROC FAR
SUB AX,AX
PUSH DS ;SET UP FAR RETURN TO DOS
PUSH AX
MOV BX,DS ;SAVE PSP POINTER
MOV AX,CS
MOV DS,AX ;MAKE DS POINT TO CODE SEG
MOV MYOWNPSP,BX ;SAVE PSP POINTER
MOV BX,LOCORE ;LO CORE POINTER
MOV ES,BX ;ES --> TO DOS CORE AREA
MOV AX,SYSSIZE ;GET ROM SET MEM SIZE
MOV ORIGSYS,AX
MOV BX,IOCSIZE
MOV ORIGIOC,BX
MOV CL,6
SHL AX,CL ;GET TRUE STARTING MEM SIZE IN PARAS
SUB BX,BX
CLD ;INSURE DIR FLAG IS FORWARD
PUSH DS
PUSH ES
;
; SCAN AND CLEAR MEMORY
;
MEM0120:
CMP AX,0A000H ;OUTSIDE LEGITIMATE MEMORY?
JE MEM0140 ;YES-WE HAVE A 640 K MACHINE
MOV DS,AX ;GET WORD TO TRY
MOV ES,AX ;POINT TO WITH ES FOR INITIALIZATION
MOV [BX],AX ;SAVE DATA THERE
CMP AX,[BX] ;SAME DATA THERE?
JNE MEM0140 ;NO-END OF CORE FOUND
PUSH AX ;SAVE SEGMENT OF THIS 64 K BLOCK
MOV CX,8000H ;32K WORDS TO ZERO
SUB DI,DI ;INDEX = 0
SUB AX,AX ;DATA = 0 (PREVENT PARITY CHECKS)
REP STOSW ;CLOBBER THE 64 K BLOCK
POP AX ;RESTORE WORKING PARA
ADD AX,1000H ;POINT TO NEXT BLOCK
JMP MEM0120 ;DO ANOTHER 64k
MEM0140:
POP ES
POP DS ;RESTORE POINTERS
MOV CL,6
SHR AX,CL ;CONVERT TOP OF MEM TO KBYTES
MOV SYSSIZE,AX ;SAVE MEM SIZE IN KB
SUB AX,ORIGSYS ;SUBTRACT ORIGINAL SIZE
ADD AX,ORIGIOC ;GET ORIGINAL IO CHANNEL MEM SIZE
MOV IOCSIZE,AX ;SAVE IO CHANNEL SIZE IN LO CORE
;*******************************************************************************
;
; CHASE DOWN LAST MCB AND UPDATE THE MOTHER
;
;*******************************************************************************
MOV BX,SYSSIZE ;GET DOS MEMORY SIZE (LO CORE)
MOV AX,MYOWNPSP ;GET ADDRESS OF THIS SEGMENT
DEC AX ;-1 FOR POINTER TO MEM CTRL BLK
PUSH ES ;SAVE LO-CORE POINTER
;
; CHASE MEM CTRL BLK CHAIN UNTIL END (BYTE 0 = C'Z') FOUND
;
MEM0220:
MOV ES,AX ;POINT TO MCB W/ ES
CMP BYTE PTR ES:[0],'Z' ;ENDING CONTROL BLOCK?
JE MEM0240 ;YES-EXIT CHAIN CHASE
ADD AX,ES:[3] ;ELSE - POINT TO NEXT BLOCK
INC AX ;AND POINT PAST IT BY 16 BYTES
JMP MEM0220 ;CONTINUE UNTIL END LOCATED
;
; UPDATE LAST MCB TO REFLECT REAL MEM SIZE
;
MEM0240:
MOV CL,6 ;SHIFT FOR K BYTE CONVERT
SHL BX,CL ;CONVERT TO K
SUB BX,AX ;GET THE ADDITIONAL MEMORY SIZE
DEC BX ;MINUS 1 PARAGRAPH (FIX UP FOR INC AX)
MOV ES:[3],BX ;SAVE MEMORY SIZE IN LAST MCB
POP ES ;RESTORE LO-CORE POINTER
MOV DX,OFFSET SIZMSG
MOV AH,9 ;DOS PRINT STRING
INT 21H ;CALL DOS
RET ;ALL DONE
MEM0000 ENDP
MEMINIT ENDS
END MEM0000